/*
 * F_Paths.c
 *
 *  Created on: 04/11/2011
 *      Author: tacho
 */
#include "../../headers/GlobalHeaderPFS.h"

/*-------------------------------------------------------------------------*/
/**
A partir de un PATH, me arma una lista de los nombres de los directorios
componentes de dicho PATH
 */
tNodoSubPaths * armarSubsPaths(const char *path) {

	uint32_t cantCaracteresCorrimiento = 0;
	tNodoSubPaths * listaSubPaths = NULL;
	tNodoSubPaths * listaSubPathsTemp;
	tNodoSubPaths * p;
	uint32_t cantCaracteresActuales;
	while ((path[cantCaracteresCorrimiento] != '\0')
			&& (path[cantCaracteresCorrimiento] != '\n')) {
		for (cantCaracteresActuales = 0;
				((path[cantCaracteresCorrimiento] != '\0')
						&& (path[cantCaracteresCorrimiento] != '/')
						&& (path[cantCaracteresCorrimiento] != '\n'));
				cantCaracteresActuales++) {
			cantCaracteresCorrimiento++;
		}
	listaSubPathsTemp = (tNodoSubPaths *) malloc(sizeof(tNodoSubPaths));
	memset(listaSubPathsTemp->subPath," ",20);
		//listaSubPathsTemp->subPath = calloc(cantCaracteresActuales + 1,sizeof(char*));
		if ((path[cantCaracteresCorrimiento] == '/')
				&& (cantCaracteresCorrimiento == 0)) {
			cantCaracteresActuales++;
			memcpy(listaSubPathsTemp->subPath, path, cantCaracteresActuales);
		} else {
			memcpy(listaSubPathsTemp->subPath,
					path + (cantCaracteresCorrimiento - cantCaracteresActuales),
					cantCaracteresActuales);
		}
		listaSubPathsTemp->subPath[cantCaracteresActuales]='\0';
		listaSubPathsTemp->sgte=NULL;
		if (listaSubPaths == NULL) {
			listaSubPaths = listaSubPathsTemp;
			p = listaSubPaths;
		} else {
			p->sgte = listaSubPathsTemp;
			p = listaSubPathsTemp;
		}
		if(path[cantCaracteresCorrimiento] != '\n' && path[cantCaracteresCorrimiento] != '\0'){
			cantCaracteresCorrimiento++;
						}
		}
	return listaSubPaths;
}

/*-------------------------------------------------------------------------*/
/**

 */
int32_t eliminarUltimoSubPaths(char * path,char * pathDevuelvo) {

	tNodoSubPaths * listaSubPaths = armarSubsPaths(path);
	tNodoSubPaths * listaSubPathsTemp = listaSubPaths;
	uint32_t anteultimo = 0;
	uint32_t cantCaracteres = 0;

	while (anteultimo == 0) {
		if (strcmp(listaSubPathsTemp->subPath, "/") == 0) {
			cantCaracteres++;
		} else {
			cantCaracteres = cantCaracteres
					+ strlen(listaSubPathsTemp->subPath);
			cantCaracteres++;
		}

		if (listaSubPathsTemp->sgte->sgte == NULL) {
			anteultimo = 1;
		}
		listaSubPathsTemp = listaSubPathsTemp->sgte;
	}

	listaSubPathsTemp = listaSubPaths;
	uint32_t inicio = 0;
	char * barra = "/";

	//char * pathADevolver;
	char pathADevolver[50];// = (char *) malloc(cantCaracteres);

	while (listaSubPathsTemp != NULL) {
		if (strcmp(listaSubPathsTemp->subPath, "/") == 0) {
			memcpy(pathADevolver + inicio, barra, sizeof('/'));
			inicio++;

		} else {
			//memcpy(pathADevolver + inicio, listaSubPathsTemp->subPath,strlen(listaSubPathsTemp->subPath));
			strcpy(pathADevolver + inicio, listaSubPathsTemp->subPath);
			inicio = inicio + strlen(listaSubPathsTemp->subPath);
			memcpy(pathADevolver + inicio, barra, sizeof('/'));
			inicio++;
		}
		if (listaSubPathsTemp->sgte->sgte == NULL) {
			vaciarSubsPaths(&listaSubPaths);
			pathADevolver[inicio]='\0';
			strcpy(pathDevuelvo,pathADevolver);
			return 0;
		}
		listaSubPathsTemp = listaSubPathsTemp->sgte;
	}
	pathADevolver[inicio]='\0';
	strcpy(pathDevuelvo,pathADevolver);
	return 0;
}

/*-------------------------------------------------------------------------*/
/**

 */
int32_t ultimoPath(char * path,char * ultimo) {

	tNodoSubPaths * listaSubPaths = armarSubsPaths(path);
	tNodoSubPaths * listaSubPathsTemp = listaSubPaths;

	listaSubPathsTemp = listaSubPaths;

	while (listaSubPathsTemp->sgte != NULL) {
		listaSubPathsTemp= listaSubPathsTemp->sgte;
		}
	strcpy(ultimo,listaSubPathsTemp->subPath);
	vaciarSubsPaths(&listaSubPaths);
	return 0;
}

/*-------------------------------------------------------------------------*/
/**

 */
void vaciarSubsPaths (tNodoSubPaths ** listaSubsPaths){
	tNodoSubPaths * listaAux;
	while (*listaSubsPaths != NULL){
	listaAux = *listaSubsPaths;
	*listaSubsPaths = (*listaSubsPaths)->sgte;
	//char * path = listaAux->subPath;
	//free(path);
	//path = NULL;
	free(listaAux);
	listaAux=NULL;
	}

}

/*-------------------------------------------------------------------------*/
/**

 */
void paseAMayuscula(char nombre[]){
	uint32_t var;
	for (var=0;var<strlen(nombre);var++)
		nombre[var]=toupper(nombre[var]);
}

/*-------------------------------------------------------------------------*/
/**
Recibe un nombre que archivo que puede tener extension o no, y de acuerdo a eso
rellena las cadenas de nombre y extension.
 */
void separarNombreExt(char * nombreNuevo,char nombre[],char extension[]){

	uint32_t var = 0;
	//nombre
	char nombreTemp[13];
	memset(nombre,' ',20);
	memset(extension,' ',3);
	memset(nombreTemp,' ',13);
	while((nombreNuevo[var])!='.' && (nombreNuevo[var])!='\0'){
			nombreTemp[var]=nombreNuevo[var];
			var++;
	}
		//(*nombre)= (char *) malloc(var);
		memcpy(nombre,nombreTemp,var);
	//extension
		if((nombreNuevo[var])!='\0'){
			//(*extension)= (char *) malloc(3);
		memcpy(extension,&nombreNuevo[var+1],3);

		}else{
			extension="   ";
			nombreTemp[var]='\0';
		}

}
